package com.qianfeng.smartdevice.service.impl;

import com.qianfeng.smartdevice.cache.SceneCache;
import com.qianfeng.smartdevice.ebums.CheckType;
import com.qianfeng.smartdevice.exception.AddDataErrorException;
import com.qianfeng.smartdevice.exception.MyErrorCode;
import com.qianfeng.smartdevice.exception.QueryDataErrorException;
import com.qianfeng.smartdevice.mapper.SysSceneMapper;
import com.qianfeng.smartdevice.pojo.SysScene;
import com.qianfeng.smartdevice.pojo.SysUserInfo;
import com.qianfeng.smartdevice.service.SysSceneService;
import com.qianfeng.smartdevice.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import java.util.Date;
import java.util.concurrent.ExecutionException;
/**
 * @time: 2022-03-17 19:50
 */
@Service
@Transactional
public class SysSceneServiceImpl implements SysSceneService {
    private SceneCache sceneCache;
    @Autowired
    public void setSceneCache(SceneCache sceneCache) {
        this.sceneCache = sceneCache;
    }

    private SysSceneMapper sysSceneMapper;
    @Autowired
    public void setSysCategoryMapper(SysSceneMapper sysSceneMapper) {
        this.sysSceneMapper = sysSceneMapper;
    }

    @Override
    public void addSysScene(SysScene sysScene) {
        Assert.isTrue(!sysScene.isEmpty(CheckType.ADD),()->{
            throw new AddDataErrorException("场景不能为空", MyErrorCode.DATA_NULL);
        });
        //必须登录,
        //检查当前是不是登录了用户,如何判断用户登录了,所以有一个地方一定保存了登录的用户(数据到底保存在什么地方是由我们自己决定的)
        SysUserInfo userInfo = SecurityUtils.getLongUser();
        Assert.notNull(userInfo,()->{
            throw new AddDataErrorException("未登录",MyErrorCode.NOT_LOGIN);
        });
        //我们的要求是同一个用户同名的场景只能添加一个
        //我们不能给表设计为名字是唯一的,这样所有的用户只能一个人创建这个名字,我们的要求是每个用户同样数据的唯一
        SysScene scene = sysSceneMapper.findByUserAndName(userInfo.getUId(), sysScene.getSceneName());
        //更具用户和场景的名字查询数据,如果能查询到,则代表存在(检查是不是被标记为删除),查询不到就不存在
        //如果数据已经存在,但是是在删除的状态,我们就更新,如果不存在就添加,否则抛出异常
        Assert.isTrue(scene==null||scene.getStatus()==0,()->{
            throw new AddDataErrorException("场景已存在",MyErrorCode.DATA_ALLREADY_EXIST);
        });
        if(scene==null){
            sysScene.setCreateBy(userInfo.getUId());
            sysScene.setCreateTime(new Date());
            sysSceneMapper.addSysScene(sysScene);
        }else {
            sysSceneMapper.updateStatus(scene.getSceneId(),1L);
        }
    }

    @Override
    public SysScene findById(Long key) throws ExecutionException {
        SysUserInfo userInfo = SecurityUtils.getLongUser();
        Assert.notNull(userInfo,()->{
            throw new AddDataErrorException("未登录",MyErrorCode.NOT_LOGIN);
        });
        //查询数据的时候需要根据id和当前的用户进行查询
        //方式1查询数据库的条件就是主键和用户id

        //方式2根据主键查询数据,然后代码中判断用户
        //从缓存中查询
//        Assert.isTrue(sysScene.getSceneId()!=null,()->{
//            throw new QueryDataErrorException("数据不存在", MyErrorCode.DATA_NULL);
//        });
//        //判断数据是不是属于当前用户的
//        Assert.isTrue(sysScene.getCreateBy()==userInfo.getUId(),()->{
//            throw new QueryDataErrorException("数据不存在", MyErrorCode.DATA_NULL);
//        });
        SysScene sysScene = sceneCache.get(key);
        Assert.isTrue(sysScene.getSceneId()!=null&&sysScene.getCreateBy()==userInfo.getUId(),()->{
            throw new QueryDataErrorException("数据不存在",MyErrorCode.DATA_NULL);
        });
        return sysScene;
    }
}